package console

import (
	"fmt"
	"os"
	"strings"
	"time"

	"gitee.com/shuwenhe/shuwen/log/mylog/util"
)

type Level uint16 // 日志级别

const ( // 5种日志级别
	Debug Level = iota // 开模式调试，线上生产环境不用
	Info               // 给用户看
	Warn               // 系统可以恢复到正常状态
	Error              // 错误可能无法修复会宕机
	Fatal              // 无法修复保留有效数据并停机
)

type ConsoleLogger struct {
	level Level
}

func NewConsoleLogger(level, FileName, FilePath string) *ConsoleLogger { // 文件日志结构体构造函数
	logLevel := ParseLogLevel(level)
	c1 := &ConsoleLogger{
		level: logLevel,
	}
	return c1
}

func getLevel(level Level) string { // 根据传进来的level获取对应的字符串
	switch level {
	case Debug:
		return "DEBUG"
	case Info:
		return "INFO"
	case Warn:
		return "WARN"
	case Error:
		return "ERROR"
	case Fatal:
		return "FATAL"
	default:
		return "DEBUG"
	}
}

func ParseLogLevel(level string) Level { // 根据用户传入的字符串类型的日志级别，解析出对应的Level
	level = strings.ToLower(level)
	switch level {
	case "debug":
		return Debug
	case "info":
		return Info
	case "warn":
		return Warn
	case "error":
		return Error
	case "fatal":
		return Fatal
	default:
		return Debug
	}
}

func (c *ConsoleLogger) log(level Level, format string, args ...interface{}) {
	if c.level > Debug {
		return
	}
	msg := fmt.Sprintf(format, args...)                    // 得到用户要记录的日志
	nowStr := time.Now().Format("2006-01-02 15:04:05.000") // log格式:[time][file:line num][func name][log level]log message
	fileName, line, funcName := util.GetCallerInfo(3)
	logLevel := getLevel(level)
	logMsg := fmt.Sprintf("[%s][%s:%d][%s]%s", nowStr, fileName, line, funcName, logLevel, msg)
	fmt.Fprintln(os.Stdout, logMsg) // 利用fmt包将msg字符串写入f.file文件中
}

func (f *ConsoleLogger) Debug(format string, args ...interface{}) { // Debug Level = iota 开发者调试
	f.log(Debug, format, args...)
}

func (f *ConsoleLogger) Info(format string, args ...interface{}) { // Info 给用户看
	f.log(Info, format, args...)
}

func (f *ConsoleLogger) Warn(format string, args ...interface{}) { // Warn 系统可以恢复到正常状态
	f.log(Debug, format, args...)
}

func (f *ConsoleLogger) Error(format string, args ...interface{}) { // Error 错误可能无法修复会=>宕机
	f.log(Debug, format, args...)
}

func (f *ConsoleLogger) Fatal(format string, args ...interface{}) { // Fatal 无法修复=>保留有效数据并停机
	f.log(Debug, format, args...)
}
